package com.linkgie.galaxyframework.data;

import com.linkgie.galaxyframework.utils.DataPagination;
import com.linkgie.galaxyframework.utils.Pagination;
import com.linkgie.galaxyframework.utils.PageNo;
import com.linkgie.galaxyframework.utils.PagingArgs;

public final class Paging {

    private Paging() {
    }

    /**
     * 包装成分页数据；
     * 
     * @param <T>
     * @param data 数据；可以为 null ；
     * @return
     */
    public static <T> PaginableData<T> wrap(T data) {
        return new PaginableDataEntry<T>(data, null);
    }

    public static <T> PaginableData<T> of(int pageIndex, int pageSize, T data) {
        PagingArgs pagingIndex = new PagingArgs(pageIndex, pageSize);
        return new PaginableDataEntry<T>(data, new DataPagination(pagingIndex));
    }

    public static <T> PaginableData<T> of(int pageIndex, int pageSize, T data, Long totalSize) {
        PagingArgs pagingIndex = new PagingArgs(pageIndex, pageSize);
        return new PaginableDataEntry<T>(data, new DataPagination(pagingIndex, totalSize));
    }

    /**
     * 包装成分页数据；
     * 
     * @param <T>
     * @param page 分页标识；可以为 null ；
     * @param data       数据；可以为 null ；
     * @return
     */
    public static <T> PaginableData<T> of(Pagination page, T data) {
        return new PaginableDataEntry<T>(data, page);
    }

    /**
     * 包装成分页数据；
     * 
     * @param <T>
     * @param pagination     分页标识；可以为 null ；
     * @param data           数据；可以为 null ；
     * @param totalSize 总记录数；可以为 null ；
     * @return
     */
    public static <T> PaginableData<T> of(PageNo pagination, T data, Long totalSize) {
        return new PaginableDataEntry<T>(data, new DataPagination(pagination, totalSize));
    }

    private static class PaginableDataEntry<T> implements PaginableData<T> {

        private final T data;

        private final Pagination page;

        PaginableDataEntry(T data, Pagination page) {
            this.data = data;
            this.page = page;
        }

        @Override
        public Pagination getPagination() {
            return this.page;
        }

        @Override
        public T getData() {
            return this.data;
        }

    }

}
